public class Main {
    public static void main(String[] args) {
        /**
         * */
        // 准备数据
        int[] arr = new int[]{9, 4, 1, 3, 6, 8, 7, 2, 0, 5};
        int[] arr1 = new int[]{1, 2, 3};
        // bubbleSort(arr);
        divide(arr);
        reverse(arr1);

        for(int e: arr) {
            System.out.print(e + " ");
        }
        System.out.println();

        for(int e: arr1) {
            System.out.print(e + " ");
        }
    }

    public static void bubbleSort(int[] arr) {
        /**
         * 冒泡排序（升序）
         * 排序逻辑：
         *  n个元素排序n-1轮，每轮将最大的一个元素放在队尾*/
        // 1 预处理
        int n = arr.length;

        // 2 冒泡排序
        for(int i = 0; i < n-1; i++) { // -表示排序轮数
            for(int j = 0; j < n-i-1; j++) { // -表示待排序区间大小，由于每次都是当前和后面一个元素比，故仅枚举到n-2位置，又因为每轮会使得一个元素有序，故-j
                if(arr[j] > arr[j+1]) {
                    swap(j, j+1, arr);
                }
            }
        }
    }

    public static void reverse(int[] arr) {
        /**
         * 逆序数组
         * 实现逻辑：
         *  创建双指针分别指向头和尾，每轮进行交换元素，直至left>=right*/
        // 1 预处理
        int n = arr.length;

        // 2 逆序
        int left = 0;
        int right = n-1;
        while(left < right) {
            swap(left++, right--, arr);
        }
    }

    public static void divide(int[] arr) {
        /**
         * 划分数组，偶数在前，奇数在后
         *  实现逻辑：使用双指针划分数组的思想进行实现*/
        // 1 预处理
        int n = arr.length;

        // 2 双指针划分数组
        int boundary = -1;
        for(int i = 0; i < n; i++) {
            if(arr[i] % 2 == 0) {
                swap(++boundary, i, arr);
            }
        }
    }

    public static void swap(int a, int b, int[] arr) {
        /**
         * 交换数组中两个元素的下标*/
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
}
